import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 利用class对象获取方法
 */
public class ReflexDemo4 {
    public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("Student");

        // 获取单个公共方法
        Method method = clazz.getMethod("getAge");
        // 获取全部公共方法
        Method[] declaredMethods = clazz.getMethods();
        // 获取单个方法【私有+共有】
        Method clazzDeclaredMethod = clazz.getDeclaredMethod("eat", String.class);
        // 获取全部方法
        Method[] declaredMethods1 = clazz.getDeclaredMethods();


        // 获取方法修饰符
        System.out.println(clazzDeclaredMethod.getModifiers());
        // 获取方法名称
        System.out.println(clazzDeclaredMethod.getName());
        // 获取方法形参
        System.out.println(clazzDeclaredMethod.getParameters());
        // 获取方法抛出的异常
        System.out.println(clazzDeclaredMethod.getExceptionTypes());


        // 利用反射调用对象的方法，并接受返回值
        Student student = new Student("Jixer", 1);
        Method run = clazz.getDeclaredMethod("run", String.class);
        run.setAccessible(true);
        String res = (String) run.invoke(student, "zzzz");
        System.out.println(res);

    }
}
